/**
 * @file debug.h
 * @brief 统一串口调试输出管理
 */

#ifndef DEBUG_H
#define DEBUG_H

#include <Arduino.h>

// ==================== 调试开关总控制 ====================
#define MASTER_DEBUG_ENABLED 0        // 主调试开关(1=启用,0=禁用) - 崩溃时设为1进行排错

// ==================== 各模块调试开关 ====================
#define DEBUG_SERIAL 1                         // 串口调试开关(1=启用,0=禁用)
#define DEBUG_SERIAL_MAIN MASTER_DEBUG_ENABLED // main.cpp调试开关 - 受主开关控制
#define DEBUG_SERIAL_FFT 1                     // FFT模块调试开关(1=启用,0=禁用)
#define DEBUG_SERIAL_LED 1                     // LED模块调试开关(1=启用,0=禁用)
#define DEBUG_SERIAL_ADC 1                     // ADC模块调试开关(1=启用,0=禁用)
#define DEBUG_SERIAL_MENU 1                    // 菜单模块调试开关(1=启用,0=禁用)
#define DEBUG_SERIAL_DISPLAY 1                 // 显示模块调试开关(1=启用,0=禁用)

// ==================== 统一调试宏定义 ====================
// main.cpp专用调试宏
#if DEBUG_SERIAL_MAIN
  #define DEBUG_MAIN_PRINTLN(x) Serial.println(x)
  #define DEBUG_MAIN_PRINTF(fmt, ...) Serial.printf(fmt, ##__VA_ARGS__)
  #define DEBUG_MAIN_PRINT(x) Serial.print(x)
#else
  #define DEBUG_MAIN_PRINTLN(x)
  #define DEBUG_MAIN_PRINTF(fmt, ...)
  #define DEBUG_MAIN_PRINT(x)
#endif

// 通用调试宏（兼容旧代码）
#if DEBUG_SERIAL
  #define DEBUG_PRINTLN(x) Serial.println(x)
  #define DEBUG_PRINTF(fmt, ...) Serial.printf(fmt, ##__VA_ARGS__)
  #define DEBUG_PRINT(x) Serial.print(x)
#else
  #define DEBUG_PRINTLN(x)
  #define DEBUG_PRINTF(fmt, ...)
  #define DEBUG_PRINT(x)
#endif

// 各模块专用调试宏
#if DEBUG_SERIAL_FFT
  #define DEBUG_FFT_PRINTLN(x) Serial.println(x)
  #define DEBUG_FFT_PRINTF(fmt, ...) Serial.printf(fmt, ##__VA_ARGS__)
  
#else
  #define DEBUG_FFT_PRINTLN(x)
  #define DEBUG_FFT_PRINTF(fmt, ...)
#endif

// 各模块专用调试宏
#if DEBUG_SERIAL_ADC
  #define DEBUG_ADC_PRINTLN(x) Serial.println(x)
  #define DEBUG_ADC_PRINTF(fmt, ...) Serial.printf(fmt, ##__VA_ARGS__)
  #define DEBUG_ADC_PRINT(x) Serial.print(x)
#else
  #define DEBUG_ADC_PRINTLN(x)
  #define DEBUG_ADC_PRINTF(fmt, ...)
  #define DEBUG_ADC_PRINT(x)
#endif

#if DEBUG_SERIAL_LED
  #define DEBUG_LED_PRINTLN(x) Serial.println(x)
  #define DEBUG_LED_PRINTF(fmt, ...) Serial.printf(fmt, ##__VA_ARGS__)
#else
  #define DEBUG_LED_PRINTLN(x)
  #define DEBUG_LED_PRINTF(fmt, ...)
#endif

#if DEBUG_SERIAL_MENU
  #define DEBUG_MENU_PRINTLN(x) Serial.println(x)
  #define DEBUG_MENU_PRINTF(fmt, ...) Serial.printf(fmt, ##__VA_ARGS__)
#else
  #define DEBUG_MENU_PRINTLN(x)
  #define DEBUG_MENU_PRINTF(fmt, ...)
#endif

#if DEBUG_SERIAL_DISPLAY
  #define DEBUG_DISPLAY_PRINTLN(x) Serial.println(x)
  #define DEBUG_DISPLAY_PRINTF(fmt, ...) Serial.printf(fmt, ##__VA_ARGS__)
#else
  #define DEBUG_DISPLAY_PRINTLN(x)
  #define DEBUG_DISPLAY_PRINTF(fmt, ...)
#endif

// 日志级别定义
enum LogLevel {
    LOG_ERROR = 0,    // 错误信息，最高优先级
    LOG_WARNING,      // 警告信息
    LOG_INFO,         // 一般信息
    LOG_DEBUG,        // 调试信息，最低优先级
    LOG_LEVEL_COUNT   // 日志级别总数
};

// 日志输出间隔（毫秒）
#define LOG_ERROR_INTERVAL   1000    // 错误日志输出间隔
#define LOG_WARNING_INTERVAL 2000    // 警告日志输出间隔
#define LOG_INFO_INTERVAL    3000    // 信息日志输出间隔
#define LOG_DEBUG_INTERVAL   5000    // 调试日志输出间隔

// 日志标签
#define LOG_ERROR_TAG   "[错误] "
#define LOG_WARNING_TAG "[警告] "
#define LOG_INFO_TAG    "[信息] "
#define LOG_DEBUG_TAG   "[调试] "

/**
 * @brief 初始化调试输出系统
 */
void initDebug();

/**
 * @brief 统一的日志输出函数
 * 
 * @param level 日志级别
 * @param format 格式化字符串
 * @param ... 可变参数
 * @return true 输出成功
 * @return false 输出被抑制（时间间隔控制或调试开关关闭）
 */
bool logPrintf(LogLevel level, const char* format, ...);

/**
 * @brief 错误日志输出函数
 * 
 * @param format 格式化字符串
 * @param ... 可变参数
 * @return true 输出成功
 * @return false 输出被抑制
 */
bool logError(const char* format, ...);

/**
 * @brief 警告日志输出函数
 * 
 * @param format 格式化字符串
 * @param ... 可变参数
 * @return true 输出成功
 * @return false 输出被抑制
 */
bool logWarning(const char* format, ...);

/**
 * @brief 信息日志输出函数
 * 
 * @param format 格式化字符串
 * @param ... 可变参数
 * @return true 输出成功
 * @return false 输出被抑制
 */
bool logInfo(const char* format, ...);

/**
 * @brief 调试日志输出函数
 * 
 * @param format 格式化字符串
 * @param ... 可变参数
 * @return true 输出成功
 * @return false 输出被抑制
 */
bool logDebug(const char* format, ...);

/**
 * @brief 带自定义时间间隔的调试日志输出函数
 * 
 * @param interval 自定义输出间隔（毫秒）
 * @param msgId 消息ID（用于区分不同的调试消息）
 * @param format 格式化字符串
 * @param ... 可变参数
 * @return true 输出成功
 * @return false 输出被抑制
 */
bool logDebugWithInterval(uint32_t interval, const char* msgId, const char* format, ...);

/**
 * @brief 强制输出日志（忽略时间间隔控制）
 * 
 * @param level 日志级别
 * @param format 格式化字符串
 * @param ... 可变参数
 * @return true 输出成功
 * @return false 输出被抑制（调试开关关闭）
 */
bool logForce(LogLevel level, const char* format, ...);

/**
 * @brief 设置是否在重启后强制输出一次日志
 * 
 * @param enable true=启用，false=禁用
 */
void setForceLogOnRestart(bool enable);

/**
 * @brief 获取日志级别对应的标签
 * 
 * @param level 日志级别
 * @return const char* 日志标签
 */
const char* getLogLevelTag(LogLevel level);

/**
 * @brief 获取日志级别对应的输出间隔
 * 
 * @param level 日志级别
 * @return uint32_t 输出间隔（毫秒）
 */
uint32_t getLogLevelInterval(LogLevel level);

/**
 * @brief LED数值链调试输出函数
 * 
 * @param bandIndex 当前频段索引
 * @param bandsCount 总频段数
 * @param targetBands 目标频段值数组
 * @param smoothedValue 平滑后的值
 * @param displayHeight LED显示高度
 * @param segmentSize 每段LED数量
 */
void debugLEDValueChain(int bandIndex, int bandsCount, float* targetBands, 
                       float smoothedValue, int displayHeight, int segmentSize);

#endif // DEBUG_H